home *** CD-ROM | disk | FTP | other *** search
/ AmigActive 10 / AACD 10.iso / AACD / Games / MAME / src / vidhrdw / galpanic.c < prev    next >
C/C++ Source or Header  |  2000-05-04  |  4KB  |  172 lines

  1. #include "driver.h"
  2. #include "vidhrdw/generic.h"
  3.  
  4.  
  5.  
  6. unsigned char *galpanic_bgvideoram,*galpanic_fgvideoram;
  7. size_t galpanic_fgvideoram_size;
  8.  
  9.  
  10.  
  11. void galpanic_init_palette(unsigned char *palette, unsigned short *colortable,const unsigned char *color_prom)
  12. {
  13.     int i;
  14.  
  15.     palette += 3*1024;    /* first 1024 colors are dynamic */
  16.  
  17.     /* initialize 555 RGB lookup */
  18.     for (i = 0;i < 32768;i++)
  19.     {
  20.         int r,g,b;
  21.  
  22.         r = (i >>  5) & 0x1f;
  23.         g = (i >> 10) & 0x1f;
  24.         b = (i >>  0) & 0x1f;
  25.  
  26.         (*palette++) = (r << 3) | (r >> 2);
  27.         (*palette++) = (g << 3) | (g >> 2);
  28.         (*palette++) = (b << 3) | (b >> 2);
  29.     }
  30. }
  31.  
  32.  
  33.  
  34. READ_HANDLER( galpanic_bgvideoram_r )
  35. {
  36.     return READ_WORD(&galpanic_bgvideoram[offset]);
  37. }
  38.  
  39. WRITE_HANDLER( galpanic_bgvideoram_w )
  40. {
  41.     int sx,sy,color;
  42.  
  43.  
  44.     COMBINE_WORD_MEM(&galpanic_bgvideoram[offset],data);
  45.  
  46.     sy = (offset/2) / 256;
  47.     sx = (offset/2) % 256;
  48.  
  49.     color = READ_WORD(&galpanic_bgvideoram[offset]);
  50.  
  51.     plot_pixel(tmpbitmap, sx, sy, Machine->pens[1024 + (color >> 1)]);
  52. }
  53.  
  54. READ_HANDLER( galpanic_fgvideoram_r )
  55. {
  56.     return READ_WORD(&galpanic_fgvideoram[offset]);
  57. }
  58.  
  59. WRITE_HANDLER( galpanic_fgvideoram_w )
  60. {
  61.     COMBINE_WORD_MEM(&galpanic_fgvideoram[offset],data);
  62. }
  63.  
  64. READ_HANDLER( galpanic_paletteram_r )
  65. {
  66.     return READ_WORD(&paletteram[offset]);
  67. }
  68.  
  69. WRITE_HANDLER( galpanic_paletteram_w )
  70. {
  71.     int r,g,b;
  72.     int oldword = READ_WORD(&paletteram[offset]);
  73.     int newword = COMBINE_WORD(oldword,data);
  74.  
  75.  
  76.     WRITE_WORD(&paletteram[offset],newword);
  77.  
  78.     r = (newword >>  6) & 0x1f;
  79.     g = (newword >> 11) & 0x1f;
  80.     b = (newword >>  1) & 0x1f;
  81.     /* bit 0 seems to be a transparency flag for the front bitmap */
  82.  
  83.     r = (r << 3) | (r >> 2);
  84.     g = (g << 3) | (g >> 2);
  85.     b = (b << 3) | (b >> 2);
  86.  
  87.     palette_change_color(offset / 2,r,g,b);
  88. }
  89.  
  90. READ_HANDLER( galpanic_spriteram_r )
  91. {
  92.     return READ_WORD(&spriteram[offset]);
  93. }
  94.  
  95. WRITE_HANDLER( galpanic_spriteram_w )
  96. {
  97.     COMBINE_WORD_MEM(&spriteram[offset],data);
  98. }
  99.  
  100.  
  101.  
  102. /***************************************************************************
  103.  
  104.   Draw the game screen in the given osd_bitmap.
  105.   Do NOT call osd_update_display() from this function, it will be called by
  106.   the main emulation engine.
  107.  
  108. ***************************************************************************/
  109. void galpanic_vh_screenrefresh(struct osd_bitmap *bitmap,int full_refresh)
  110. {
  111.     int offs;
  112.     int sx,sy;
  113.  
  114.  
  115.     palette_recalc();
  116.  
  117.     /* copy the temporary bitmap to the screen */
  118.     /* it's raw RGB, so it doesn't have to be recalculated even if palette_recalc() */
  119.     /* returns true */
  120.     copybitmap(bitmap,tmpbitmap,0,0,0,0,&Machine->drv->visible_area,TRANSPARENCY_NONE,0);
  121.  
  122.     for (offs = 0;offs < galpanic_fgvideoram_size;offs+=2)
  123.     {
  124.         int color;
  125.  
  126.  
  127.         sx = (offs/2) % 256;
  128.         sy = (offs/2) / 256;
  129.  
  130.         color = READ_WORD(&galpanic_fgvideoram[offs]);
  131.         if (color)
  132.         {
  133.             plot_pixel(bitmap, sx, sy, Machine->pens[color]);
  134.         }
  135.     }
  136.  
  137.  
  138.     sx = sy = 0;
  139.     for (offs = 0;offs < spriteram_size;offs += 0x10)
  140.     {
  141.         int x,y,code,color,flipx,flipy;
  142.  
  143.  
  144.         x = READ_WORD(&spriteram[offs + 8]) - ((READ_WORD(&spriteram[offs + 6]) & 0x01) << 8);
  145.         y = READ_WORD(&spriteram[offs + 10]) + ((READ_WORD(&spriteram[offs + 6]) & 0x02) << 7);
  146.         if (READ_WORD(&spriteram[offs + 6]) & 0x04)    /* multi sprite */
  147.         {
  148.             sx += x;
  149.             sy += y;
  150.         }
  151.         else
  152.         {
  153.             sx = x;
  154.             sy = y;
  155.         }
  156.  
  157.         /* bit 0 [offs + 0] is used but I don't know what for */
  158.  
  159.         code = READ_WORD(&spriteram[offs + 12]) + ((READ_WORD(&spriteram[offs + 14]) & 0x1f) << 8);
  160.         color = (READ_WORD(&spriteram[offs + 6]) & 0xf0) >> 4;
  161.         flipx = READ_WORD(&spriteram[offs + 14]) & 0x80;
  162.         flipy = READ_WORD(&spriteram[offs + 14]) & 0x40;
  163.  
  164.         drawgfx(bitmap,Machine->gfx[0],
  165.                 code,
  166.                 color,
  167.                 flipx,flipy,
  168.                 sx,sy - 16,
  169.                 &Machine->drv->visible_area,TRANSPARENCY_PEN,0);
  170.     }
  171. }
  172.